﻿Option Explicit On

Public Class frmIrr
    Private params As Object
    Private is_run As Boolean
    Private Const SITE_URL As String = "http://komsomolsk.irr.ru/"
    Private adverts() As AdvertType
    Private cur_adv As Integer
    Public Const ADV_NAME As String = "irr"
    Public file_name As String
    Public catalog_name As String
    Private h1 As String
    Private wbc As New System.Net.WebClient
    Private Tesseract As New clsTesseract(ADV_NAME)


    Private Sub frmIrr_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        cboCatalog.Items.Add("Продажа")
        cboCatalog.Items.Add("Аренда")
        cboCatalog.Items.Add("Спрос")
        cboCatalog.Items.Add("Обмен")
        params = { _
            { _
                "rooms-sale||Комнаты и доли|ИРР-Комнаты|к", _
                "apartments-sale|rooms=1/|1-комнатные|ИРР-1|1", _
                "apartments-sale|rooms=2/|2-комнатные|ИРР-2|2", _
                "apartments-sale|rooms=3/|3-комнатные|ИРР-3|3", _
                "apartments-sale|rooms=4/|4-комнатные|ИРР-4|4", _
                "apartments-sale|rooms=1686892012/|5-ти и более комнатные|ИРР-5|5" _
            }, _
            { _
                "rent||Квартиры", _
                "commercial||Коммерческая", _
                "rooms-rent||Комнаты", _
                "out-of-town-rent||Дома, дачи", _
                "garage-rent||Гаражи и стоянки", _
                "" _
            }, _
            {"spros||Спрос", "", "", "", "", ""}, _
            {"exchange||Обмен", "", "", "", "", ""} _
        }
        cboCatalog.SelectedIndex = 0

        lstConsole.Left = 0
        lstConsole.Dock = DockStyle.Fill
        web.ScriptErrorsSuppressed = True
        wbc.Encoding = System.Text.Encoding.UTF8
    End Sub


    Private Sub cboCatalog_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cboCatalog.SelectedIndexChanged
        Dim n As Integer, value As String
        cboKomnat.Items.Clear()
        For n = 0 To 5
            value = params(cboCatalog.SelectedIndex, n)
            If value <> "" Then
                cboKomnat.Items.Add(Split(value, "|")(2))
            End If
        Next
        cboKomnat.SelectedIndex = 0
    End Sub



    Private Sub btnRun_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnRun.Click
        Dim url As String, catalog() As String
        Dim match As Match
        Dim p As Integer, n As Integer, max_page As Integer
        Dim response As String

        btnRun.Enabled = False

        catalog = Split(params(cboCatalog.SelectedIndex, cboKomnat.SelectedIndex), "|")
        'Получаем имя файла и раздел
        Me.file_name = catalog(3)
        Me.catalog_name = catalog(4)
        'Подготавливаем URL
        url = SITE_URL & "real-estate/" & catalog(0) & "/search/" & catalog(1) & "currency=RUR/page_len60/"

        'Получить первую страницу
        Try : response = wbc.DownloadString(url)
        Catch ex As System.Net.WebException
            myConsole(lstConsole, "Страница не получена. " & ex.Message) : Exit Sub
        End Try

        'Найдем кол-во страниц
        Dim tmpS As String
        tmpS = "<a href=""/real-estate/" & catalog(0) & ".*?" & catalog(1) & ".*?/page(\d{1,3})/"">"
        max_page = 1
        For Each match In Regex.Matches(response, tmpS)
            p = CInt(match.Groups(1).Value)
            If p > max_page Then max_page = p
        Next
        myConsole(lstConsole, "В разделе найдено " & max_page & " страниц")

        'В цикле проходим по всем страницам
        cur_adv = 0
        ReDim adverts(0)
        For p = 1 To max_page
            myConsole(lstConsole, "Загружаем " & p & "-ю страницу")
            Application.DoEvents()

            'Первую страницу мы уже получили
            If p > 1 Then
                Try : response = wbc.DownloadString(url & "page" & p & "/")
                Catch ex As Exception
                    myConsole(lstConsole, "Страница не получена. " & ex.Message) : Exit Sub
                End Try
            End If

            'Удаляем все что ниже заголовка "Предложения из ближайших регионов"
            n = response.IndexOf("Предложения из ближайших регионов")
            If n > -1 Then response = response.Remove(n)

            'Получаем со страницы все объявления
            tmpS = "<a href="".*?advert(\d+)\.html"" class=""adv_pic"">"
            For Each match In Regex.Matches(response, tmpS)
                ReDim Preserve adverts(cur_adv)
                adverts(cur_adv).url = "advert/" & match.Groups(1).Value & "/"
                adverts(cur_adv).advid = match.Groups(1).Value
                cur_adv = cur_adv + 1
            Next
        Next

        'Запускаем граббер
        h1 = "Из рук в руки - " & cboCatalog.Text & " " & cboKomnat.Text
        timTick.Interval = 3000
        timTick.Start()
        cur_adv = 0
        txtCur.Text = 0
        txtMax.Text = adverts.Count
        myConsole(lstConsole, "Найдено " & adverts.Count & " объявлений")
        lstConsole.Items.Add("")
    End Sub



    Private Sub timTick_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timTick.Tick
        Dim match As Match
        Dim response As String
        Dim tmpS As String, tmpS2 As String, tmpO As Object
        Dim n As Integer, m As Integer
        Dim phones_line As String, phone As String, separ As String
        Dim flag As Boolean = False

        timTick.Stop()
        txtCur.Text = cur_adv + 1
        myConsole(lstConsole, (cur_adv + 1) & " объявление загружается")

        With adverts(cur_adv)
            '.advid = "307056637"
            '.url = "advert/" & .advid & "/"

            'Проверим если объявление старое, то не загружаем его
            If chkOnlyNew.Checked = True Then
                If DBAdverts_isOldAdvert(ADV_NAME, .advid) = True Then
                    myConsole(lstConsole, "---Это объявление старое")
                    .state = AdvState.old
                    GoTo next_advert
                End If
            End If

            'Загружаем страницу
            Try : response = wbc.DownloadString(SITE_URL & .url)
            Catch ex As Exception
                myConsole(lstConsole, "Страница не получена. " & ex.Message)
                Exit Sub
            End Try

            'Получаем номер телефона
            Dim phones As New ArrayList
            'Получаем Base64 адрес картинки с телефоном
            match = Regex.Match(response, "<input id='allphones'.*?value=""(.*?)""")
            If match.Success = False Then
                .state = AdvState.bad
                GoTo next_advert
            End If
            tmpS = match.Groups(1).Value
            If tmpS = "" Then
                .state = AdvState.bad
                GoTo next_advert
            End If
            tmpS = match.Groups(1).Value

            'Декодируем Base64 строку
            tmpS = FromBase64String(tmpS)
            'Получаем URL адреса картинок с телефонами
            For Each match In Regex.Matches(tmpS, "<img src\s*?=\s*?'(.*?)'")
                'Загружаем картинку с сервера
                tmpS2 = Tesseract.path & "irr.jpg"
                Try : wbc.DownloadFile(match.Groups(1).Value, tmpS2)
                Catch ex As Net.WebException
                    MsgBox(ex.Message) : Exit Sub
                End Try

                'Загружаем скачаную картинку в память и сохраняем картинку размером в 2 раза больше
                Tesseract.ResizeBitmap(tmpS2)
                'Запускаем Tesseract для распознавания текста
                Tesseract.StartOCR()

                Try
                    'Загружаем из полученного текстового файла номер телефона
                    phones_line = IO.File.ReadAllText(Tesseract.path & "irr.txt").Trim()
check_phones:
                    phones_line = phones_line.Replace("  ", " ")
                    phones_line = phones_line.Replace("- ", "-").Replace(" -", "-")
                    'Находим разделитель телефонов (если он есть)
                    Dim find_separ As String = ""
                    For Each separ In {":", "."}
                        If phones_line.IndexOf(separ) > -1 Then
                            find_separ = separ
                            Exit For
                        End If
                    Next

                    'Если разделитель не найден, то устанавливаем его равному знаку |
                    If find_separ = "" Then find_separ = "|"

                    For Each phone In Split(phones_line, find_separ)
                        phone = phone.Trim()
                        If phone = "" Then Continue For

                        tmpO = getBigPhone(phone)
                        'Если телефон неверный, то запрашиваем у юзера ручной ввод телефона
                        If Equals(tmpO, False) = True Then
                            frmAdvertPhone.file_name = "irr.jpg"
                            frmAdvertPhone.txtPhone.Text = phones_line
                            frmAdvertPhone.ShowDialog(Me)
                            phones_line = Join(frmAdvertPhone.phones, ":")
                            frmAdvertPhone.Dispose()
                            GoTo check_phones
                        Else
                            tmpS2 = tmpO.ToString()
                        End If
                        'Ищем телефон в риэлторах
                        If DBEstate_isEstate(tmpS2, True) = True Then
                            myConsole(lstConsole, "---Это риэлтор")
                            .state = AdvState.estateInDB
                            'Сохраняем объявление с риэлтором как старое
                            If DBAdverts_isOldAdvert(ADV_NAME, .advid) = False Then
                                DBAdverts_addOldAdvert(ADV_NAME, .advid)
                            End If
                            'Переходим к следующему объявлению
                            GoTo next_advert
                        End If
                        'Добавляем телефон в массив
                        phones.Add(tmpS2)
                    Next
                Catch ex As Exception
                    MsgBox(ex.Message) : Exit Sub
                End Try
            Next
            .phone = phones.ToArray(System.Type.GetType("System.String"))

skip_phone:
            .state = AdvState.normal

            'Текст
            Dim text As String
            match = Regex.Match(response, "<p class=""text"">(.*?)</p>", RegexOptions.Singleline)
            text = match.Groups(1).Value

            'Проверяем печатное издание
            Dim is_print_advert As Boolean = False
            tmpS = "Дата выхода объявления в печатном издании:\s*\d{2}\.\d{2}\.\d{4}"
            match = Regex.Match(text, tmpS)
            If match.Success = True Then
                is_print_advert = True
                text = Regex.Replace(text, tmpS, "")
            End If

            'Удаляем лишнее из текста
            text = Regex.Replace(text, "<.*?>", "")
            text = Regex.Replace(text, "[\r\n]", "")
            text = Regex.Replace(text, "&quot;", """").Trim()
            text = text.Trim()

            If is_print_advert = False Then
                'Ищем адрес
                .street = Regex.Match(response, "<a class=""address_link"".*?>(.*?)</a>").Groups(1).Value
                .street = Regex.Replace(.street, " ,", ",")
                .street = Regex.Replace(.street, "Комсомольск-на-Амуре", "")
                If .street.StartsWith(",") = True Then .street = .street.Substring(1)
                .street = .street.Trim()
                .AddText(.street)
                tmpO = .street.Split(",")
                If UBound(tmpO) = 1 Then
                    .street = tmpO(0).ToString.Trim
                    .street = GetNormStreet(.street, False, {"ул", "пр-кт", "пр-т", "пер"})
                    .nomer = tmpO(1).ToString.Trim
                End If

                'Блок характеристик
                Dim name As String, value As String
                Dim komn1 As String = "", komn2 As String = ""
                Dim match2 As Match, match3 As Match
                Dim params As String = ""
                For Each match In Regex.Matches(response, "<ul class=""form_info form_info_short"">(.*?)</ul>", RegexOptions.Singleline)
                    For Each match2 In Regex.Matches(match.Groups(1).Value, "<li>(.*?)</li>", RegexOptions.Singleline)
                        match3 = Regex.Match(match2.Groups(1).Value, "<p>(.*?)</p>.*?<p>(.*?)</p>", RegexOptions.Singleline)
                        name = match3.Groups(1).Value.Trim()
                        If name.EndsWith(":") Then name = name.Substring(0, name.Length - 1)
                        value = match3.Groups(2).Value.Trim()
                        If value.IndexOf("checkbox") > -1 Then value = "есть" 'галочка

                        'Обрабатываем параметры
                        Select Case name
                            'Исключаем некоторые параметры
                            Case "Комнат в квартире", _
                                 "Приватизированная квартира", _
                                 "Район города", _
                                 "Балкон/Лоджия", _
                                 "Интернет", _
                                 "Телефон", _
                                 "Высота потолков", _
                                 "Комнат в квартире", _
                                 "Отказ получен"
                                Continue For

                                'Предустановленые параметры
                            Case "Этаж" : .floor = value : flag = True
                            Case "Этажей в здании" : .floor_all = value : flag = True
                            Case "Материал стен" : .building = value.ToLower() : flag = True
                            Case "Общая площадь", "Общая площадь квартиры"
                                .kvm_all = Replace(CStr(Val(value)), ",", ".") : flag = True
                            Case "Жилая площадь", "Площадь продажи"
                                .kvm_live = Replace(CStr(Val(value)), ",", ".") : flag = True
                            Case "Площадь кухни" : .kvm_kitchen = Replace(CStr(Val(value)), ",", ".") : flag = True

                                'Свободные параметры
                            Case "Санузел"
                                value = value.ToLower()
                                If value = "раздельный" Or value = "совмещённый" Then value = value.Substring(0, 4) & " "
                                params = params & "с/у " & value & ", "
                            Case "Количество комнат на продажу"
                                komn1 = value
                            Case "Комнат в квартире/общежитии"
                                komn2 = value

                                'Неизвесные параметры
                            Case "&nbsp;"
                                'ничего не делать
                            Case Else
                                params = params & name & " " & value & ", "
                        End Select
                    Next match2
                Next match
                If komn1 <> "" Or komn2 <> "" Then params = "Комнат " & komn1 & " в " & komn2 & "-х, " & params
                .AddContent(params)
                If flag = True Then
                    params = .floor & "/" & .floor_all & "эт, " & .building & " " & _
                             .kvm_all & "/" & .kvm_live & "/" & .kvm_kitchen & "кв.м, " & params
                End If
                .AddText(params)
                'Материал стен
                If .building = "панельный" Or .building = "совмещённый" Then .building = .building.Substring(0, 1).ToLower()
            End If

            .AddText(text)
            .AddContent(text)

            'Цена
            tmpS = Regex.Match(response, "<div class=""credit_cost"">(.*?)<u>").Groups(1).Value
            tmpS = tmpS.Replace(" ", "").Replace(".", "").Replace("&nbsp;", "").Trim()
            If Val(tmpS) > 99000 And tmpS.EndsWith("000") Then
                tmpS = tmpS.Substring(0, tmpS.Length - 3)
                .AddText(tmpS & "тыс")
            Else
                .AddText(tmpS)
            End If
            .price = tmpS

next_advert:
            lstConsole.Items.Add("")
            If cur_adv = adverts.Count - 1 Then
                'Exit Sub
                'Объявления кончились, выводим их
                grbControl.Enabled = False
                lstConsole.Visible = False
                web.Visible = True
                web.Left = 0
                web.Dock = DockStyle.Fill

                'Подготавливаем список перед выводом
                AdvertsCreateList(adverts, chkSaveNew.Checked, ADV_NAME)

                'Собираем HTML код и обновляем WebBrowser
                AdvertsShowList(web, adverts, h1, AddressOf SpanPhoneClick, ADV_NAME)
            Else
                'Смотрим следующее объявление
                If .state = AdvState.old Then 'Если это старая объява, то не ждем
                    timTick.Interval = 100
                Else 'Ждем 1.5 сек
                    timTick.Interval = 1500
                End If
                timTick.Start()
            End If
        End With
        cur_adv = cur_adv + 1
    End Sub



    Private Sub SpanPhoneClick(ByVal sender As Object, ByVal e As System.EventArgs)
        AdvertsSpanPhoneClick(web, adverts, h1, AddressOf SpanPhoneClick, ADV_NAME)
    End Sub



    Public Function getAdverts() As Object
        Return adverts
    End Function
End Class